import React, { useCallback, useEffect } from 'react';
import { getSysSip } from '../../servers/sip';
import { JSONObject } from '../../seats/schema/common';
import eventBus from '../../utils/eventBus';
import { useSelector } from 'react-redux';

/**
 * sip服务
 */
const SipComponent: React.FC = () => {
  const checkInState = useSelector((state: JSONObject) => state.checkInState);

  /**初始化sip、链接状态 */
  const initBindSipEvent = useCallback(async () => {
    // debugger;
    console.log('sip初始化++++++++++++++++');
    const ins = await getSysSip().waitInit();
    // 监听connected事件 然后再注册
    ins.bindUAEvent('connected', () => {
      console.log('connected==== 执行registereUA');
      ins.registereUA();
    });
    ins.bindUAEvent('newRTCSession', (evt: JSONObject) => {
      // evt.session是针对一次会话
      // 增加媒体流 开始通话
      evt.session.on('peerconnection', (connect: any) => {
        console.log('peerconnection==通话已链接====', connect);
        connect.peerconnection.ontrack = (data: any) => {
          console.log('ontrack === ', data);
          // 播放提示音
          ins.playAudio(data.streams[0]);
        };
      });
      // 接通
      evt.session.on('confirmed', (sipEvt: JSONObject) => {
        console.log('confirmed==通话接通====', sipEvt);
        eventBus.emit('confirmed');
      });
      // 通话未建立(坐席长时间，未接听，自动取消)
      evt.session.on('failed', (sipEvt: JSONObject) => {
        const { callId } = evt.session.data;
        console.log('failed==通话未建立====', callId, sipEvt);
        eventBus.emit('hideTransferPop', callId);
      });
      // 挂断
      evt.session.on('ended', function (sipEvt: JSONObject) {
        const { flag, callId } = evt.session.data;
        console.log('ended==通话结束===flag', flag, callId);
        eventBus.emit('ended', flag);
        eventBus.emit('hideTransferPop', callId);
      });
      // 振铃
      evt.session.on('progress', (sipEvt: any) => {
        console.log('progress==开始振铃====', sipEvt);
        eventBus.emit('progress');
      });
      // remote 远端发起呼叫
      if (evt.originator === 'remote') {
        console.log('SipComponent===远端发起呼叫>>>>>>evt=====', evt);
        // 呼叫标记，具体值及描述（transfer - 呼转; intercept - 截听; eavesdrop - 监听）
        const flag = evt.request.getHeader('X-M-Flag');
        // 呼叫中心的会话标识
        const callId = evt.request.getHeader('X-M-Call-Id');
        if (flag === 'transfer' || flag === 'normal') {
          // 叮咚提示
          // 场景：（1.人机协同任务，转接听transfer；2.人工自动任务normal）
          console.log('************有用户通话接入===播放提示音：叮咚******', flag);
          const audio = new Audio('/webapp/dindong.wav');
          // 播放提示音
          audio.play();
        }
        // 每次更新flag，方便ended等消息接收时，判断是监听还是人工介入、转人工监听
        // evt.session是针对一次会话
        evt.session.data = {
          flag,
          callId,
        };
        if (flag === 'transfer') {
          // 转人工-手动接听
          console.log('SipComponent===转人工组件-接听触发***', String(callId));
          // 触发显示转人工按钮
          eventBus.emit('showTransferPop', evt, String(callId));
        } else {
          // flag === 'eavesdrop' || flag === 'intercept' || flag === 'normal'
          // 其他自动接听
          evt.session.answer({
            mediaConstraints: { audio: true },
          });
        }
      } else {
        // local 本地发起呼叫
      }
    });
  }, []);

  useEffect(() => {
    console.log('渲染====SipComponent****', checkInState);
    if (checkInState === 2) {
      initBindSipEvent();
    }
  }, [checkInState, initBindSipEvent]);

  return <></>;
};

export default SipComponent;
